<?php
/**
 * CViewConfig class file.
 * 获取或设置模板配置数据.
 * @author Huan Song <iphper@yeah.net>
 * @version $Id: CViewConfig.php 1 2011-01-20 20:05:00Z huan.song $
 * @package system.views
 * @since 2.0
 */
class CViewConfig extends CConfig
{
	/**
	 * @var string 模板引擎类路径.
	 */
	protected static $_classPath;
	
	/**
	 * @var string 所有模板皮肤的根目录.
	 */
	protected static $_skinsDir;
	
	/**
	 * @var string 当前使用的模板皮肤名.
	 */
	protected static $_skinName;
	
	/**
	 * @var string 编译后文件存放目录.
	 */
	protected static $_compileDir;
	
	/**
	 * @var string 左限制符.
	 */
	protected static $_leftDelimiter;
	
	/**
	 * @var string 右限制符.
	 */
	protected static $_rightDelimiter;
	
	/**
	 * @var string 模板文件后缀名.
	 */
	protected static $_templateSuffix;
	
	/**
	 * @var string 页面字符编码.
	 */
	protected static $_charset;
	
	/**
	 * @var string 控制器结尾自动显示模板.
	 */
	protected static $_noView;
	
	/**
	 * 获取模板引擎类路径.
	 * <pre>
	 * $classPath = CViewConfig::getClassPath();
	 * </pre>
	 * @return string 模板引擎类路径.
	 * @see setClassPath
	 */
	public static function getClassPath()
	{
		if (null === self::$_classPath)
			self::setClassPath();
		
		return self::$_classPath;
	}
	
	/**
	 * 设置模板引擎类路径.
	 * <pre>
	 * $classPath = null;
	 * CViewConfig::setClassPath($classPath);
	 * 如果$classPath === null, 取配置中
	 * 'view' => array(
	 * 		'classPath' => FRAMEWORK_DIR . '/views/CView.php', //模板引擎类路径.
	 * 	),
	 * 结果: self::$_classPath = FRAMEWORK_DIR . '/views/CView.php'.
	 * </pre>
	 * @param string|null $classPath. 如果为null, 取用户自定义的配置路径; 如果配置中没定义, 默认为FRAMEWORK_DIR . '/views/CView.php'.
	 * @throws CViewException. 如果模板引擎类路径不存在, 抛出异常.
	 * @see getClassPath
	 */
	public static function setClassPath($classPath = null)
	{
		if (null === $classPath)
		{
			$classPath = self::get('view', 'classPath');
			if (null === $classPath)
				$classPath = FRAMEWORK_DIR . DS . 'views' . DS . 'CView.php';
		}
		
		if (!file_exists($classPath))
			throw new CViewException('CViewConfig:setClassPath classPath not exists', array('{classPath}' => $classPath));	
		
		self::$_classPath = $classPath;
	}
	
	/**
	 * 获取所有模板皮肤的根目录.
	 * <pre>
	 * $skinsDir = CViewConfig::getSkinsDir();
	 * </pre>
	 * @return string 所有模板皮肤的根目录.
	 * @see setSkinsDir
	 */
	public static function getSkinsDir()
	{
		if (null === self::$_skinsDir)
			self::setSkinsDir();
		
		return self::$_skinsDir;
	}
	
	/**
	 * 设置所有模板皮肤的根目录.
	 * <pre>
	 * $skinsDir = null;
	 * CViewConfig::setSkinsDir($skinsDir);
	 * 如果$skinsDir === null, 取配置中
	 * 'view' => array(
	 * 		'skinsDir' => APP_DIR . '/views', //所有模板皮肤的根目录.
	 * 	),
	 * 结果: self::$_skinsDir = APP_DIR . '/views'.
	 * </pre>
	 * @param string|null $skinsDir. 如果为null, 取用户自定义的配置路径; 如果配置中没定义, 默认为APP_DIR . '/views'.
	 * @throws CViewException. 如果所有模板皮肤的根目录不存在, 抛出异常.
	 * @see getSkinsDir
	 */
	public static function setSkinsDir($skinsDir = null)
	{
		if (null === $skinsDir)
		{
			$skinsDir = self::get('view', 'skinsDir');
			if (null === $skinsDir)
				$skinsDir = APP_DIR . DS . 'views';
		}
		
		if (!is_dir($skinsDir))
			throw new CViewException('CViewConfig:setSkinsDir skinsDir not exists', array('{skinsDir}' => $skinsDir));
			
		self::$_skinsDir = $skinsDir;
	}
	
	/**
	 * 获取当前使用的模板皮肤名.
	 * <pre>
	 * $skinName = CViewConfig::getSkinName();
	 * </pre>
	 * @return string 当前使用的模板皮肤名.
	 * @see setSkinName
	 */
	public static function getSkinName()
	{
		if (null === self::$_skinName)
			self::setSkinName();
			
		return self::$_skinName;
	}
	
	/**
	 * 设置当前使用的模板皮肤名.
	 * <pre>
	 * $skinsDir = null;
	 * CViewConfig::setSkinName($skinName);
	 * 如果$skinName === null, 取配置中
	 * 'view' => array(
	 * 		'skinName' => 'default', //当前使用的模板皮肤名.
	 * 	),
	 * 结果: self::$_skinName = 'default'.
	 * </pre>
	 * @param string|null $skinName. 如果为null, 取用户自定义的名称; 如果配置中没定义, 默认为'default'.
	 * @see getSkinName
	 */
	public static function setSkinName($skinName = null)
	{
		if (null === $skinName)
		{
			$skinName = self::get('view', 'skinName');
			if (null === $skinName)
				$skinName = 'default';
		}
		
		self::$_skinName = $skinName;
	}
	
    /**
     * 获取模板所在的目录.
     * <pre>
	 * $templateDir = CViewConfig::getTemplateDir();
	 * </pre>
     * @return array 模板所在的目录.
     * @throws CViewException. 如果模板所在的目录不存在, 抛出异常.
     */
    public static function getTemplateDir()
    {
    	$templateDir = self::getSkinsDir() . DS . self::getSkinName();
    	if (!is_dir($templateDir))
    		throw new CViewException('CViewConfig:getTemplateDir templateDir not exists', array('{templateDir}' => $templateDir));
    		
    	return $templateDir;
    }
    
	/**
	 * 获取编译后文件存放目录.
	 * <pre>
	 * $compileDir = CViewConfig::getCompileDir();
	 * </pre>
	 * @return string 编译后文件存放目录.
	 * @see setCompileDir
	 */
	public static function getCompileDir()
	{
		if (null === self::$_compileDir)
			self::setCompileDir();
			
		return self::$_compileDir;
	}
	
	/**
	 * 设置模板编译后文件存放目录.
	 * <pre>
	 * $compileDir = null;
	 * CViewConfig::setCompileDir($compileDir);
	 * 如果$compileDir === null, 取配置中
	 * 'view' => array(
	 * 		'compileDir' => APP_DIR . '/runtime/compile', //编译后文件存放目录.
	 * 	),
	 * 结果: self::$_compileDir = APP_DIR . '/runtime/compile'.
	 * </pre>
	 * @param string|null $compileDir. 如果为null, 取用户自定义的配置路径; 如果配置中没定义, 默认为APP_DIR . '/runtime/compile'.
	 * @throws CViewException. 如果无法创建模板编译后文件存放目录, 抛出异常, 通常是app文件夹不可写导致无法创建.
	 * @see getCompileDir
	 */
	public static function setCompileDir($compileDir = null)
	{
		if (null === $compileDir)
		{
			$compileDir = self::get('view', 'compileDir');
			if (null === $compileDir)
				$compileDir = APP_DIR . DS . 'runtime' . DS . 'compile';
		}
		
		if (!is_dir($compileDir))
    		throw new CViewException('CViewConfig:setCompileDir compileDir not exists', array('{compileDir}' => $compileDir));	
    	
		self::$_compileDir = $compileDir;
	}
	
	/**
	 * 获取左限制符.
	 * <pre>
	 * $leftDelimiter = CViewConfig::getLeftDelimiter();
	 * </pre>
	 * @return string 左限制符.
	 * @see setLeftDelimiter
	 */
	public static function getLeftDelimiter()
	{
		if (null === self::$_leftDelimiter)
			self::setLeftDelimiter();
			
		return self::$_leftDelimiter;
	}
	
	/**
	 * 设置左限制符.
	 * <pre>
	 * $leftDelimiter = null;
	 * CViewConfig::setLeftDelimiter($leftDelimiter);
	 * 如果$leftDelimiter === null, 取配置中
	 * 'view' => array(
	 * 		'leftDelimiter' => '<!--{',
	 * 	),
	 * 结果: self::$_leftDelimiter = '<!--{'.
	 * </pre>
	 * @param string|null $leftDelimiter. 如果为null, 取用户自定义的配置路径; 如果配置中没定义, 默认为'<!--{'.
	 * @see getLeftDelimiter
	 */
	public static function setLeftDelimiter($leftDelimiter = null)
	{
		if (null === $leftDelimiter)
		{
			$leftDelimiter = self::get('view', 'leftDelimiter');
			if (null === $leftDelimiter)
				$leftDelimiter = '<!--{';
		}
		
		self::$_leftDelimiter = $leftDelimiter;
	}
	
	/**
	 * 获取右限制符.
	 * <pre>
	 * $rightDelimiter = CViewConfig::getRightDelimiter();
	 * </pre>
	 * @return string 右限制符.
	 * @see setRightDelimiter
	 */
	public static function getRightDelimiter()
	{
		if (null === self::$_rightDelimiter)
			self::setRightDelimiter();
			
		return self::$_rightDelimiter;
	}
	
	/**
	 * 设置右限制符.
	 * <pre>
	 * $rightDelimiter = null;
	 * CViewConfig::setRightDelimiter($rightDelimiter);
	 * 如果$rightDelimiter === null, 取配置中
	 * 'view' => array(
	 * 		'rightDelimiter' => '}-->',
	 * 	),
	 * 结果: self::$_rightDelimiter = '<!--{'.
	 * </pre>
	 * @param string|null $rightDelimiter. 如果为null, 取用户自定义的配置路径; 如果配置中没定义, 默认为'}-->'.
	 * @see getRightDelimiter
	 */
	public static function setRightDelimiter($rightDelimiter = null)
	{
		if (null === $rightDelimiter)
		{
			$rightDelimiter = self::get('view', 'rightDelimiter');
			if (null === $rightDelimiter)
				$rightDelimiter = '}-->';
		}
		
		self::$_rightDelimiter = $rightDelimiter;
	}
	
	/**
	 * 获取模板文件后缀名.
	 * <pre>
	 * $templateSuffix = CViewConfig::getTemplateSuffix();
	 * </pre>
	 * @return string 模板文件后缀名.
	 * @see setTemplateSuffix
	 */
	public static function getTemplateSuffix()
	{
		if (null === self::$_templateSuffix)
			self::setTemplateSuffix();
			
		return self::$_templateSuffix;
	}
	
	/**
	 * 设置模板文件后缀名.
	 * <pre>
	 * $templateSuffix = null;
	 * CViewConfig::setTemplateSuffix($templateSuffix);
	 * 如果$templateSuffix === null, 取配置中
	 * 'view' => array(
	 * 		'templateSuffix' => '.phtml', //模板文件后缀名.
	 * 	),
	 * 结果: self::$_templateSuffix = '.phtml'.
	 * </pre>
	 * @param string|null $templateSuffix. 如果为null, 取用户自定义的配置路径; 如果配置中没定义, 默认为'.phtml'.
	 * @see getTemplateSuffix
	 */
	public static function setTemplateSuffix($templateSuffix = null)
	{
		if (null === $templateSuffix)
		{
			$templateSuffix = self::get('view', 'templateSuffix');
			if (null === $templateSuffix)
				$templateSuffix = '.phtml';
		}
		
		self::$_templateSuffix = $templateSuffix;
	}
	
	/**
	 * 获取页面字符编码.
	 * <pre>
	 * $charset = CViewConfig::getCharset();
	 * </pre>
	 * @return string 页面字符编码.
	 * @see setCharset
	 */
	public static function getCharset()
	{
		if (null === self::$_charset)
			self::setCharset();
			
		return self::$_charset;
	}
	
	/**
	 * 设置页面字符编码.
	 * <pre>
	 * $charset = null;
	 * CViewConfig::setCharset($charset);
	 * 如果$charset === null, 取配置中
	 * 'view' => array(
	 * 		'charset' => 'UTF-8', //页面字符编码.
	 * 	),
	 * 结果: self::$_charset = 'UTF-8'.
	 * </pre>
	 * @param string|null $charset. 如果为null, 取用户自定义字符编码; 如果配置中没定义, 默认为'UTF-8'.
	 * @see getCharset
	 */
	public static function setCharset($charset = null)
	{
		if (null === $charset)
		{
			$charset = self::get('view', 'charset');
			if (null === $charset)
				$charset = 'UTF-8';
		}
		
		self::$_charset = $charset;
	}
	
	/**
	 * 获取是否控制器结尾自动显示模板.
	 * <pre>
	 * $noView = CViewConfig::getNoView();
	 * </pre>
	 * @return boolean 控制器是否结尾自动显示模板.
	 * @see setNoView
	 */
	public static function getNoView()
	{
		if (null === self::$_noView)
			self::setNoView();
		
		return self::$_noView;
	}
	
	/**
	 * 设置控制器结尾自动显示模板.
	 * <pre>
	 * $noView = null;
	 * CViewConfig::setNoView($noView);
	 * 如果$noView === null, 取配置中
	 * 'view' => array(
	 * 		'noView' => false, //控制器结尾自动显示模板.
	 * 	),
	 * 结果: self::$_noView = false.
	 * </pre>
	 * @param boolean|null $noView. 如果为null, 取用户自定义字符编码; 如果配置中没定义, 默认为false.
	 * @see getNoView
	 */
	public static function setNoView($noView = null)
	{
		if (null === $noView)
		{
			$noView = self::get('view', 'noView');
			if (null === $noView)
				$noView = false;
		}
		
		self::$_noView = (boolean) $noView;
	}
}
